﻿namespace StockSharp.Algo.Indicators.Oscillator
{
	using System.ComponentModel;

	using Trend;

	/// <summary>
	/// Бестрендовый ценовой осциллятор.
	/// </summary>
	[DisplayName("DPO")]
	[Description("Бестрендовый ценовой осциллятор.")]
	public class DetrendedPriceOscillator : LengthIndicator<decimal>
	{
		private readonly SimpleMovingAverage _sma = new SimpleMovingAverage();

		/// <summary>
		/// Создать <see cref="DetrendedPriceOscillator"/>.
		/// </summary>
		public DetrendedPriceOscillator()
		{
			_sma = new SimpleMovingAverage();
		}

		/// <summary>
		/// Длина периода.
		/// </summary>
		public override int Length
		{
			get
			{
				return _sma.Length;
			}
			set
			{
				_sma.Length = value;
				base.Length = (value / 2 + 1) + 1;
			}
		}

		/// <summary>
		/// Индикатор сформирован.
		/// </summary>
		public override bool IsFormed { get { return Buffer.Count >= base.Length; } }

		/// <summary>
		/// Обработать входное значение.
		/// </summary>
		/// <param name="input">Входное значение.</param>
		/// <returns>Результирующее значение.</returns>
		protected override decimal OnProcess(IIndicatorValue input)
		{
			var smaValue = _sma.Process(input);

			if (_sma.IsFormed)
				Buffer.Add(smaValue.GetValue<decimal>());

			if (!IsFormed)
				return this.GetCurrentValue();

			if (Buffer.Count > base.Length)
				Buffer.RemoveAt(0);

			return input.GetValue<decimal>() - Buffer[0];
		}
	}
}